AWS Parameters and Secrets Lambda Extensionを使用してみた

AWS Parameters and Secrets Lambda Extensionを使用してみた

Clock Icon2023.05.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS Parameters and Secrets Lambda Extensionとは?

AWS Parameters and Secrets Lambda Extensionを使用すると、Lambda 関数の AWS Secrets ManagerのシークレットとParameter Storeのパラメータを取得してキャッシュできます。

AWS Parameters and Secrets Lambda Extensionを使用するメリット:

  1. キャッシュされたシークレットまたはキャッシュされたパラメーターの取得は、それぞれ Secrets Manager またはParameter Storeアから取得するよりも高速です。そのため、関数の実行時間を短縮することができます。
  2. APIのコストを短縮することができます。

AWS Parameters and Secrets Lambda Extensionは、localhost ポート 2773 にリクエストを行います。PARAMETERS_SECRETS_EXTENSION_HTTP_PORT : 2773を環境変数として設定します。

この記事では、AWS Parameters and Secrets Lambda Extensionを使用して、Lambda 関数で AWS Secrets Manager シークレットを取得してキャッシュしてみました。

 

やってみた

Secrets Managerでシークレットの作成

  • Secrets Manager のコンソールで[Store a new secret]を選択しておきます。
  • [Other type of secret] をシークレットタイプとして選択します。
  • シークレットをキー/値ペアとして入力しておきます。

 

  • シークレットの名前を入力し、他の設定をデフォルト値のままにしてシークレットをStoreしておきます。

 

Lambda関数の作成

  • Python ランタイムで Lambda 関数を作成しておきます。最新の Python バージョンでは「No module named requests」エラーが発生するため、今回は Python 3.7 を使用します。

 

  • Lambda が Secrets Manager シークレットにアクセスできるようにする権限を持つ IAM ポリシーを作成し、このポリシーを Lambda 実行ロールにアタッチしておきます。
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"secretsmanager:GetSecretValue"
			],
			"Resource": [
				"arn:aws:secretsmanager:<region>:<account-id>:secret:*"
			]
		}
	]
}

 

Extensionを使用せずにLambdaの実行時間の確認

  • Python コードを以下のコードに置き換えます。これは、Lambda を実行するたびに Secret Manager からシークレットを取得します。
import json
import boto3

def lambda_handler(event, context):
    
    client = boto3.client('secretsmanager')
    secret = client.get_secret_value(SecretId='lambda-secret')
    return secret['SecretString']

 

  • 初めて Lambda 関数を実行するときに Secrets Manager からシークレットを取得するのにかかる時間は約 1640.58 ミリ秒です。

 

  • その後の Lambda の実行では、シークレットを取得する時間は 1640.58 ミリ秒から 265.77 ミリ秒に短縮されました。

 

Extensionを使用しているLambdaの実行時間の確認

Lambda 関数にレイヤーを追加する

  • Lambda コンソールで関数を選択し、Layersを選択して、Add a layerを選択しておきます。
  • AWS layers で [AWS Parameters and Secrets Lambda Extension] を選択して、レイヤーを追加しておきます

 

 

Lambda 関数に環境変数を追加する

  • Lambda 関数を開き、Configurationで Environment variables を選択し、Edit をクリックしておきます。
  • [Add environment variable]をクリックし、キーとして [PARAMETERS_SECRETS_EXTENSION_HTTP_PORT] を入力し、[2773] を値としてを入力し、保存しておきます。

 

 

拡張キャッシュからシークレットを取得する Python コード

  • 拡張キャッシュからシークレットを取得するために、コードのリクエストヘッダーに [X-AWS-Parameters-Secrets-Token] を追加しておきます。
  • トークンを[AWS_SESSION_TOKEN]に設定しておきます。
  • 以下はシークレットを取得するコードです。
import json
import boto3
import os
import requests

def lambda_handler(event, context):
    
    headers = {"X-Aws-Parameters-Secrets-Token": os.environ.get('AWS_SESSION_TOKEN')}
    SECRETS_EXTENSION_PORT = os.environ.get('PARAMETERS_SECRETS_EXTENSION_HTTP_PORT')
    secrets_extension_endpoint = f"http://localhost:{SECRETS_EXTENSION_PORT}/secretsmanager/get?secretId=lambda-secret"
    req = requests.get(secrets_extension_endpoint, headers=headers)
    secret = json.loads(req.text)["SecretString"] 
    return secret

 

  • 初めて Lambda 関数を実行するときに Secrets Manager からシークレットを取得するのにかかる時間は約 697.25 ミリ秒です。

 

  • その後の Lambda の実行では、シークレットを取得する時間は 697.25 ミリ秒から 29.81 ミリ秒に短縮されました。シークレットがキャッシュから取得されるため、時間が短縮されました。

 

まとめ

シークレットを取得する時間は、Secrets Manager から取得する場合に比べて大幅に短縮されました。キャッシュされたシークレットの取得は Secrets Manager からの取得よりも高速です。[AWS Parameters and Secrets Lambda Extension] を使用して、Parameter Store パラメータを取得してキャッシュすることもできます。

ReferenceUse AWS Secrets Manager secrets in AWS Lambda functions

 

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.